/**
 *	@file	picture_util.h
 *	@brief	写真セーブデータ ユーティリティー
 *	@author	Miyuki Iwasawa
 *	@date	08.05.22
 */

#ifndef __H_PICTURE_UTIL_H__
#define __H_PICTURE_UTIL_H__

#include "gflib/gf_date.h"

typedef u8 PICTURE_ID;

///写真データセーブ数
#define PICTURE_DATA_MAX	(36)
#define PICTURE_POKE_MAX	(6)

///NULLID定義
#define PICTURE_ID_NULL	(0xFF)

//------------------------------------------------------------
/**
 * @brief	写真セーブデータブロック管理構造への不完全型ポインタ
 *
 * 中身は見えないけどポインタ経由で参照はできる
 */
//------------------------------------------------------------
typedef struct _PICTURE_SAVE PICTURE_SAVE;

//写真の基本パラメータ
typedef struct PIC_POKE_DATA_tag
{
	u16	monsNo;
	u8	form;
	u8	rare:1;
	u8	sex:1;
	u8	dmy:6;
}PIC_POKE_DATA;		//4byte

typedef struct PIC_CAMERA_DATA_tag
{
	fx32			distance;		//4
	CAMERA_ANGLE	angle;			//8
	u16				view;			//2
	u16				perspWay;		//2
	fx32			near;			//4
	fx32			far;			//4
	VecFx32			shift;			//12
}PIC_CAMERA_DATA;		//36byte

typedef struct _PICTURE_DATA{
	u32	tr_id;	//<撮影者のトレーナーID
	u8	tr_sex:1;
	u8	thumbnail:7;
	u8	region;
	u8	version;
	u8	poke_num;	//<撮影時のポケモン数
													//8byte
	STRCODE name[BUFLEN_PERSON_NAME];				//2byte x 8 = 16byte
	STRCODE poke_name[BUFLEN_POKEMON_NAME];			//2byte x 12 = 24byte

	u8	form;	//<自機のフォーム
	u8	time;	//<タイムゾーン						未使用だけどセーブがずれるので削除しない
	u16	zoneID;	//<ゾーンID
	u16	x;		//<撮影場所x座標
	u16	z;		//<撮影場所y座標
													//8byte
	GF_DATE	date;	//<撮影日時						//4byte

	u16 Hour;			//時
	u16 Minute;			//分
	u16 MdlID[2];
													//8byte
	u16 AddObjCode;
	u16 RestObjID;
													//4byte
	PIC_CAMERA_DATA		camera;						//36byte
	PIC_POKE_DATA		poke[PICTURE_POKE_MAX];		//4byte x 6 = 24byte
}PICTURE_DATA;

/**
 *	@brief	写真セーブデータサイズ取得
 */
extern int PictureSv_GetWorkSize(void);

/**
 *	@brief	セーブデータブロックへのポインタを取得
 */
extern PICTURE_SAVE* SaveData_GetPictureSave(SAVEDATA* sv);

/**
 *	@brief	写真セーブデータ初期化
 */
extern void PictureSv_Init(void* sv);

/*
 *	@brief	空いているデータ領域indexを返す
 *
 *	@return	u8	データを追加できる場合は参照ID
 *				追加できない場合はPICTURE_ID_NULL= 0xFFが返る
 */
extern PICTURE_ID PictureSave_SearchNullID(PICTURE_SAVE* sv);

/**
 *	@brief	セーブ内の有効な写真データ数を取得する
 */
extern u8 PictureSave_PictureDataNum(PICTURE_SAVE* sv);

/**
 *	@brief	指定写真データ削除
 */
extern void PictureSave_DelPictureDataSingle(PICTURE_SAVE* sv,PICTURE_ID idx);

/**
 *	@brief	写真データを指定indexにセット
 */
extern BOOL PictureSave_SetPictureDataSingle(PICTURE_SAVE* sv,const PICTURE_DATA* dat,PICTURE_ID idx);

/**
 *	@brief	指定indexの写真データを取得
 */
extern BOOL PictureSave_GetPictureDataSingle(PICTURE_SAVE* sv,PICTURE_DATA* dat,PICTURE_ID idx);

/**
 *	@brief	セーブデータ内の全ての写真データをアロケートしたメモリに取得する
 *
 *	＊FreeMemoryEzで自前で解放すること！
 *
 */
extern PICTURE_DATA* PictureSave_AllocPictureDataArray(PICTURE_SAVE* sv,int heapID);




/**
 *	@brief	写真データ構造体クリア
 */
extern void PictureData_Clear(PICTURE_DATA* dat);

/*
 *	@brief	写真データが有効かどうか返す
 */
extern BOOL PictureData_IsEnable(PICTURE_DATA* dat);

/**
 *	@brief	写真データ生成
 *
 *	@param	dat
 *	@param	save
 *	@param	pc		カメラパラメータを格納した構造体への参照ポインタ
 *	@param	zoneID	プレイヤー現在位置情報(zone)
 *	@param	px		プレイヤー現在位置情報(player_x)
 *	@param	pz		プレイヤー現在位置情報(player_z)
 *	@param	form	自機の形態
 *
 */
extern void PictureData_MakePicture(PICTURE_DATA* dat,
	SAVEDATA* save,PIC_CAMERA_DATA* pc,u16 zoneID,u16 px,u16 pz,u8 form);



#endif	//__H_PICTURE_UTIL_H__